# Contributor: Carlo Landmeter <clandmeter@gmail.com>
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname=chromium
pkgver=84.0.4147.105
pkgrel=0
pkgdesc="Chromium web browser"
url="https://www.chromium.org/Home"
arch="x86_64 aarch64"	# x86: ./v8_context_snapshot_generator segfaults
			# armv7: /usr/bin/ld: final link failed: memory exhausted when linking chrome
license="BSD-3-Clause"
depends="xdg-utils"
makedepends="
	alsa-lib-dev
	bash
	binutils-gold
	bison flex
	bsd-compat-headers
	bzip2-dev
	cairo-dev
	clang-dev
	cups-dev
	dbus-glib-dev
	elfutils-dev
	eudev-dev
	ffmpeg-dev
	findutils
	flac-dev
	freetype-dev
	gnutls-dev
	gperf
	gtk+3.0-dev
	gzip
	harfbuzz-dev
	hunspell-dev
	hwids-usb
	jpeg-dev
	jsoncpp-dev
	krb5-dev
	libbsd-dev
	libcap-dev
	libevent-dev
	libexif-dev
	libgcrypt-dev
	libgnome-keyring-dev
	libjpeg-turbo-dev
	libpng-dev
	libusb-dev
	libva-dev
	libvpx-dev
	libwebp-dev
	libxcomposite-dev
	libxcursor-dev
	libxinerama-dev
	libxml2-dev
	libxrandr-dev
	libxscrnsaver-dev
	libxslt-dev
	linux-headers
	mesa-dev
	minizip-dev
	ninja
	nodejs
	nss-dev
	openjdk8
	opus-dev
	pciutils-dev
	perl
	python2
	re2-dev
	snappy-dev
	speex-dev
	sqlite-dev
	xcb-proto
	xdg-utils
	zlib-dev
	py2-setuptools
	"
# explicit depends for --headless
depends="eudev-libs ttf-opensans"
options="suid"
subpackages="$pkgname-chromedriver"
source="https://commondatastorage.googleapis.com/chromium-browser-official/chromium-$pkgver.tar.xz
	pstables-2.8.h::https://git.savannah.gnu.org/cgit/freetype/freetype2.git/plain/src/psnames/pstables.h?h=VER-2-8
	chromium-launcher.sh
	chromium.conf
	chromium.desktop
	google-api.keys

	default-pthread-stacksize.patch
	musl-fixes.patch
	musl-fixes-breakpad.patch
	musl-hacks.patch
	musl-libc++.patch
	musl-sandbox.patch
	no-execinfo.patch
	no-mallinfo.patch
	resolver.patch
	swiftshader.patch
	create-extra-view-redefinition.patch

	chromium-use-alpine-target.patch
	media-base.patch
	musl-crashpad.patch
	musl-v8-monotonic-pthread-cont_timedwait.patch
	nasm.patch

	gcc-fno-delete-null-pointer-checks.patch
	gcc-arm.patch
	aarch64-fixes.patch
	elf-arm.patch

	remove-unsupported-compiler-warnining.patch

	chromium-84-crashpad-include-cstring.patch
	chromium-84-mediaalloc.patch
	chromium-84-gcc-DCHECK_EQ-unique_ptr.patch
	chromium-84-std-vector-const.patch
	upstream-avoid-calling-DeleteForCurrentDocument-from-destructor.patch
	upstream-force-mp3-files-to-have-a-start-time-of-zero.patch
	upstream-AXObject-stl-iterator.patch
	upstream-ListContainerHelper-include-cstring.patch
	"

# secfixes:
#   83.0.4103.116-r0:
#     - CVE-2020-6505
#     - CVE-2020-6506
#     - CVE-2020-6507
#     - CVE-2020-6509
#   72.0.3626.121-r0:
#     - CVE-2019-5786

if [ -n "$DEBUG" ]; then
	_buildtype=Debug
	_is_debug=true
else
	_buildtype=Release
	_is_debug=false
fi

prepare() {
	patch_args="-p0"
	default_prepare

	# https://groups.google.com/a/chromium.org/d/topic/chromium-packagers/9JX1N2nf4PU/discussion
	touch chrome/test/data/webui/i18n_process_css_test.html
	# Use the file at run time instead of effectively compiling it in
	sed 's|//third_party/usb_ids/usb.ids|/usr/share/hwdata/usb.ids|g' \
		-i services/device/public/cpp/usb/BUILD.gn

	mkdir -p third_party/node/linux/node-linux-x64/bin
	ln -s /usr/bin/node third_party/node/linux/node-linux-x64/bin/

	# reusable system library settings
	local use_system="
		ffmpeg
		flac
		fontconfig
		freetype
		harfbuzz-ng
		libdrm
		libevent
		libjpeg
		libpng
		libvpx
		libwebp
		libxml
		libxslt
		opus
		re2
		snappy
		"
	for _lib in $use_system libjpeg_turbo; do
		msg "Removing buildscripts for system provided $_lib"
		find -type f -path "*third_party/$_lib/*" \
			\! -path "*third_party/$_lib/chromium/*" \
			\! -path "*third_party/$_lib/google/*" \
			\! -path './base/third_party/icu/*' \
			\! -path './third_party/libxml/*' \
			\! -path './third_party/pdfium/third_party/freetype/include/pstables.h' \
			\! -path './third_party/harfbuzz-ng/utils/hb_scoped.h' \
			\! -regex '.*\.\(gn\|gni\|isolate\|py\)' \
			-delete
	done

	msg "Replacing gn files"
	python2 build/linux/unbundle/replace_gn_files.py --system-libraries \
		$use_system
	third_party/libaddressinput/chromium/tools/update-strings.py

}

_gn_flags() {
	echo $*
}

build() {
	##############################################################
	# Please dont use these keys outside of Alpine Linux project #
	# You can create your own at:                                #
	# http://www.chromium.org/developers/how-tos/api-keys        #
	##############################################################
	eval "$(base64 -d < $srcdir/google-api.keys)"

	msg "Bootstrapping GN"
	local _c=$(_gn_flags is_clang=true \
		use_sysroot=false \
		treat_warnings_as_errors=false \
		fatal_linker_warnings=false \
		use_custom_libcxx=false \
		use_gold=false \
		use_allocator=\"none\" \
		use_allocator_shim=false \
		use_vaapi=true \
	)

#	AR="ar" CC="${CC:-gcc}" CXX="${CXX:-g++}" LD="${CXX:-g++}" \
	CC="${CC:-clang}" CXX="${CXX:-clang++}" LD="${CXX:-clang++}" \
		python2 tools/gn/bootstrap/bootstrap.py -s -v --gn-gen-args "$_c"

	msg "Configuring build"
	_c=$(_gn_flags \
		blink_symbol_level=0 \
		clang_use_chrome_plugins=false \
		closure_compile=true \
		custom_toolchain=\"//build/toolchain/linux/unbundle:default\" \
		enable_hangout_services_extension=true \
		enable_nacl_nonsfi=false \
		enable_nacl=false \
		enable_precompiled_headers=false \
		fatal_linker_warnings=false \
		ffmpeg_branding=\"Chrome\" \
		fieldtrial_testing_like_official_build=true \
		gold_path=\"/usr/bin/ld.gold\" \
		google_api_key=\"$_google_api_key\" \
		google_default_client_id=\"$_google_default_client_id\" \
		google_default_client_secret=\"$_google_default_client_secret\" \
		host_toolchain=\"//build/toolchain/linux/unbundle:default\" \
		icu_use_data_file=true \
		is_clang=true \
		is_component_build=false \
		is_debug=$_is_debug \
		is_desktop_linux=true \
		linux_use_bundled_binutils=false \
		proprietary_codecs=true \
		symbol_level=0 \
		treat_warnings_as_errors=false \
		use_allocator_shim=false \
		use_allocator=\"none\" \
		use_cups=true \
		use_custom_libcxx=false \
		use_gnome_keyring=false \
		use_gold=false \
		use_lld=false \
		use_pulseaudio=false \
		use_sysroot=false \
		use_system_harfbuzz=true \
	)

	AR="ar" CC="clang" CXX="clang++" LD="clang++" NM=/usr/bin/nm \
		out/Release/gn gen out/$_buildtype --args="$_c $_ca"

	# Make xcbgen available to ui/gfx/x/gen_xproto.py running under Python 2
	ln -s /usr/lib/python3.*/site-packages/xcbgen .
	export PYTHONPATH="$PWD"

	msg "Ninja turtles GO!"

	# build mksnapshot
	ninja -C out/$_buildtype mksnapshot
	ninja -C out/$_buildtype v8_context_snapshot_generator

    if [ "$CARCH" = "x86" ]; then
        # x86 only - dependency issues compiling obj/chrome/browser/devtools/devtools/cast_handler.o
        ninja -C out/$_buildtype obj/chrome/common/media_router/mojom/media_router__generator.stamp
    fi

	# final link needs lots of file descriptors
	ulimit -n 2048

	# finish rest of the build
	ninja -C out/$_buildtype chrome chrome_sandbox chromedriver
}

package() {
	cd out/$_buildtype
	local bin pak
	for bin in chrome chromedriver *.bin; do
		install -Dm755 $bin "$pkgdir"/usr/lib/$pkgname/$bin
	done

	install -Dm755 swiftshader/libEGL.so "$pkgdir"/usr/lib/$pkgname/swiftshader/libEGL.so
	install -Dm755 swiftshader/libGLESv2.so "$pkgdir"/usr/lib/$pkgname/swiftshader/libGLESv2.so

	install -Dm4755 chrome_sandbox "$pkgdir"/usr/lib/$pkgname/chrome-sandbox
	install -m644 icudtl.dat "$pkgdir"/usr/lib/$pkgname/icudtl.dat

	install -Dm755 xdg-mime "$pkgdir"/usr/lib/$pkgname/xdg-mime
	install -Dm755 xdg-settings "$pkgdir"/usr/lib/$pkgname/xdg-settings

	for pak in *.pak; do
		install -Dm644 $pak "$pkgdir"/usr/lib/$pkgname/$pak
	done

	install -Dm755 "$srcdir"/chromium-launcher.sh \
		"$pkgdir"/usr/lib/$pkgname/chromium-launcher.sh

	cp -a locales "$pkgdir"/usr/lib/$pkgname/
	cp -a MEIPreload "$pkgdir"/usr/lib/$pkgname/

	# It is important that we name the target "chromium-browser",
	# xdg-utils expect it; bug #355517.
	mkdir -p "$pkgdir"/usr/bin
	cd "$pkgdir"/usr/bin
	ln -sf /usr/lib/$pkgname/chromium-launcher.sh chromium-browser
	ln -sf /usr/lib/$pkgname/chromedriver "$pkgdir"/usr/bin/

	install -Dm644 "$srcdir"/chromium.conf \
		"$pkgdir"/etc/chromium/chromium.conf

	install -Dm644 "$srcdir"/chromium.desktop \
		"$pkgdir"/usr/share/applications/chromium.desktop

	cd "$builddir"
	for size in 24 48 64 128 256; do
		install -Dm644 "chrome/app/theme/chromium/product_logo_$size.png" \
			"$pkgdir/usr/share/icons/hicolor/"$size"x"$size"/apps/chromium.png"
	done

	for size in 16 32; do
		install -Dm644 "chrome/app/theme/default_100_percent/chromium/product_logo_$size.png" \
			"$pkgdir/usr/share/icons/hicolor/"$size"x"$size"/apps/chromium.png"
	done
}

chromedriver() {
	pkgdesc="WebDriver driver for the Chromium Browser"
	mkdir -p "$subpkgdir"/usr/lib/$pkgname "$subpkgdir"/usr/bin
	mv "$pkgdir"/usr/lib/$pkgname/chromedriver \
		"$subpkgdir"/usr/lib/$pkgname/
	mv "$pkgdir"/usr/bin/chromedriver "$subpkgdir"/usr/bin
}

sha512sums="23cdd8b49c3276b16f1b4753fadf9f428720f0a95a3f567d189ba0e8a231d7bc1f62e96da6188645243eedac15ecc554b97e83c1a63aa647e7946cc1ba015a8c  chromium-84.0.4147.105.tar.xz
a3bb959c65944ae2fb765725cedcffd743a58bc0c2cd1f1999d15fe79801d00f3474b08b4ed7b48859ed921eb57093d0ad09d90f201d729ed9b8a419a591ed29  pstables-2.8.h
b9a810416dd7a8ffc3a5ced85ad9acebda1665bd08a57eec7b189698cc5f74d2c3fd69044e20fcb83297a43214b2772a1312b2c6122ea0eb716abacf39524d60  chromium-launcher.sh
f6d962b9e4c22dd42183df3db5d3202dab33eccecafb1bf63ca678147289581262db1e5e64cbe8f9c212beefb0a6717bb8d311e497f56b55fe95b8bab2db493f  chromium.conf
e182c998a43d22d1c76a86c561619afd1fca8c2be668265ad5e2f81a3806f7a154272cc027a2f8b370fb69446892c69e5967a4be76082325c14245ee7915234c  chromium.desktop
2d8237a940ea691bd10b08315429677a587f7ef9692a0cca53bfd066eae82998a6c71f402a8669e9de39f94d7f3280745d1628ea6eac5d76ca7116844d4e0dac  google-api.keys
b726ef2ecfe7d471e60d67de1e05847d214df6093b41bb2055652a9028327af19a8b10e7175467240f4dfec9e3ae97a6c4666bfd2cd6cb436c54656a085653ae  default-pthread-stacksize.patch
5dc855cf321adbf8e7768e7a4b0684760952c607bffb0e3b6d7b8e632155ed85cb67a6734b736759f0f06c2c017de0a1be18a6e52f0796570ca39520dddffece  musl-fixes.patch
e8675aff9fccd8b58cc839ef1d9e0e022d66aa94f72baa72e7acf92ceb2691f6a7907cc60ec3a87f894efdd639a3dec7fe702c97d446fcdea99452caec57e002  musl-fixes-breakpad.patch
d78479bdea1c847d6e1506421a3eb716031cd24aa979f0e653c0406b507a5a89924d15e6c603e291f1b17751fb0788571f42699214fd1462334c0daabd584ffe  musl-hacks.patch
919f13a2cd65673f267321cf95c5410e65bc5264d6704d0791b25d39111282bedb425bd9824dde3b67422cfb874c86a9383ded686e39cfd4aac239edaf41cfc8  musl-libc++.patch
eda730d7ee307f2406e96c3313e9f3a17c2577af9bcc8cbfd4099d2b590d81a1c8adf7bf9ba58dd0ec4ebd77001701a73e0aa718cac583a01a8876ddece82d58  musl-sandbox.patch
129ec746fd951ee6d0bf0b4389b7c988523870507de1f92f5706f4eb49039d4a49ed30e92b0634e3ae521fc3e129adc1c6edc7435922fc91658d8c087520c707  no-execinfo.patch
06d6b4c466fa48f2d22c338e20458d8fa50bbbf744468f41bc3c1892e739002b1fbc5c133a37252cec4ff4f804847add6b9c0cc1f84fb276939471c09e467fb6  no-mallinfo.patch
b1edab2a782a0fd554d0fcee893374282ceca797e9595f1b4dd1c4dbeb65a5d6c368f2000f8d44baea3a53880621fa33c456b663d72960e94f2e05f9ec4f7965  resolver.patch
f4265df7532625070c51ac43466e3e0f21e696f90c3b6040ef62a21defa7666203ff8219d9c9a5bebc011024aff300fbcbd941cebd0df59c4bc068d8f290221e  swiftshader.patch
5b88c065819a44684ceea87239320f8120cfde0dc2f6dd739a007488dea6608c11584c56f3876a062641c9ca6fa82f43877c547ad470766aec31f5151bb2bdc1  create-extra-view-redefinition.patch
cf9970ef403ff7a68bf08c0ba5e681eec459fcb1afb6859e5a80f4874f1b9a656377b4540eeb5208ddec570efa206f147e32718c687fa29ca3acc4fde6e8cbe8  chromium-use-alpine-target.patch
599f5ef338b5797e04436bdc88921c31365d2dea2613d40053be6e774f654e2889efb0c0bd55c2c5044a6805510fbc337da555971169a75d584fac93e18256ac  media-base.patch
2e5a83826239849d096aead033eb519338b84e6fbbf58abfcd7cfe40d0b3070b66bcc825ec84406484d73d1a333f1b9d23a8ab44987ab5c8b187076c84cd668b  musl-crashpad.patch
556cc2ba28184a75745f13c673605327f5be590be179eb3f941dc0abded854a814e5da1432a28fb8d4dcdcd66ffd4c94ee1a8824d2cd93b632f48e9310dbc3fa  musl-v8-monotonic-pthread-cont_timedwait.patch
7957aae04e8ef3badbc98c982ba1acb1b9ef5e665440116c704512f11554d7b64ba3643b7ff7d00476a6686324033b0cf762deb78ce798619226380953b9dc9c  nasm.patch
56a357668c0928bc488ccec8f53fd37fccbaefe0a185ceaf067c8c39e0fae3d2b61ca010ccabc785bec0f2e86b19f37cebb3ac344225aa8d7651c822e48c6064  gcc-fno-delete-null-pointer-checks.patch
ad4ddc25df7aa1de2038b7adb86d27679ecdb7e3e16c0eec994e947a08c41504b6fb41166f7868ff5f58ce8191c78800cbb91d259c864840fa5af1d7ba5d43a1  gcc-arm.patch
7f81d97cce25d5530a2cb84105247e3707e344a285b0ac73c2f9275eae4bcc5aea6ff27307ec6607f95c13e9e724fab0e15e6fb8a33b3a9bfe0b3dbfdfb33ae6  aarch64-fixes.patch
9b1441fe42421ef9ead86a5143bf997d989bd53a8969cdfdf4e0c45f847efc8c1d127e15fb05e2ef5dbefbb228cbdc2849404d74997ca56265599e12e5efd6e4  elf-arm.patch
e02d4cd916ee5ff0b03fcbd22cbcad35d67338599ed099026fc13053a7e15fbd24335b9cb3961541f8da09bddb114b527230e1cbd274f6cdde012a25421076c7  remove-unsupported-compiler-warnining.patch
9e87e14a342a7dfac8642e9dac37b747336b415876062752ae75f126f3455ec093e6e434749c6816a6a885832240551aba0c141065909d3d3d3c65695ec04f57  chromium-84-crashpad-include-cstring.patch
363929fa33452f824f8351ab43b70bfcfd77d9cfd8d3fe6e56dc8813b0ae0e3fadbe43c956a2652e3f49a3434c3b58b24758a1922c7db86054b1ca7fce296ab0  chromium-84-mediaalloc.patch
e974ffcfefa69d290ccd05729c992623075b15d6718218a3634ce30ecada478f961b97123949d384ceb45075178ade1a8165374c1a5cf9b1f0d46845b4ebc5c6  chromium-84-gcc-DCHECK_EQ-unique_ptr.patch
d7c45cb25b429351dd6c3c7b2f64f1a3b3d0e2901d9eb24a5d8e6517bd16559117c4eab5565c8f2221aca7836d81ac9106af8de8ddcc11b200ddfc0bcba31c77  chromium-84-std-vector-const.patch
c81a870a10445a0b50cab0bb2b5b416e5d77f4ba2a38c7076ff8697fa496565be7186e2781f03d2a9f5837cbe7e8a84132d961cea0c1f9010218547a9c93e338  upstream-avoid-calling-DeleteForCurrentDocument-from-destructor.patch
51e3fc8cc18035bb5ec3e4da69febfad1877a594be925f1b05eb9838dad7155418b9a943e882c77e36c26caec3b08321edc130fa3c09b6e527b578e57a131b19  upstream-force-mp3-files-to-have-a-start-time-of-zero.patch
f5b39f5238e7987610088b69e834f8f0445397b54b9d6355f883311a72b97e3c7cffe663f96614025521f50ddb688951a21d6994c6533c290ac0771c0bad645f  upstream-AXObject-stl-iterator.patch
25b472576edad6fc2fc358865d673db9431eb4b3a6a60b7ff827fd41ded477d2baf7e27e8c1a5c17451c2d8577dcea7b236c36f76a673e9d72171d8a9b17a624  upstream-ListContainerHelper-include-cstring.patch"
